// #include <iostream>
// #include <pthread.h>
// #include <unistd.h>
// #include <string>
// #include <vector>
// using namespace std;


// int tickets = 1000;
// pthread_mutex_t mut;
// class customer
// {
// public:
//     pthread_t _id;
//     int _ticket;
//     string _name;
// };
// void* buy_ticket(void* arg)
// {
//     customer* cs = static_cast<customer*>(arg);

//     while (true)
//     {
//         /* code */
//         pthread_mutex_lock(&mut);
//         if(tickets>0)
//         {
//             usleep(1000);
//             tickets-=1;
//             cs->_ticket+=1;
//             cout<<cs->_name+"抢了一张票，目前剩余："<<tickets<<"张票"<<endl;
//             pthread_mutex_unlock(&mut);
//         }
//         else
//         {
//             pthread_mutex_unlock(&mut);
//             break;
//         }
//     }
//     return (void*)0;
// }



// int main()
// {
//     vector<customer> css(5);
//     pthread_mutex_init(&mut,nullptr);
//     for(int i = 0;i<5;++i)
//     {
//         css[i]._name = "thread-"+to_string(i);
//         pthread_create(&css[i]._id,nullptr,buy_ticket,&css[i]);
//         // pthread_create()
//     }
//     //线程等待
//     for(int i = 0;i<5;++i)
//     {
//        pthread_join(css[i]._id,nullptr);
//     }
//     for(int i = 0;i<5;++i)
//     {
//         cout<<css[i]._name<<"抢了："<<css[i]._ticket<<"张票"<<endl;
//     }
//     pthread_mutex_destroy(&mut);
//     return 0;
// }

#include <iostream>
#include <unistd.h>
#include <pthread.h>

using namespace std;
const int n = 5;
int ticket = 1000;
class ThraedData{
public:
    ThraedData(string name,pthread_mutex_t& mtx)
    :_name(name),_mtx(mtx)
    {}
    ~ThraedData()
    {}
public:
    string _name;
    pthread_mutex_t& _mtx;
};

void* threadRun(void* arg){
    ThraedData* td = static_cast<ThraedData*>(arg);
    int sum = 0;
    while(true){
        pthread_mutex_lock(&td->_mtx);
        if(ticket>0){
            usleep(1000);
            ticket--;
            cout<<"线程："<<td->_name<<"抢票成功"<<"剩余："<<ticket<<"张票"<<endl;
            sum++;
            pthread_mutex_unlock(&td->_mtx);
        }else{
            pthread_mutex_unlock(&td->_mtx);
            break;
        }
        usleep(1000);
    }
    cout<<"线程："<<td->_name<<"抢票数量："<<sum<<endl;
    delete td;
    return nullptr;
}


int main()
{
    pthread_t pts[n];
    pthread_mutex_t mtx;
    pthread_mutex_init(&mtx,nullptr);
    for(int i = 0;i<n;++i){
        char* name = new char[64];
        snprintf(name,64,"Thread-%d",i);
        ThraedData* td = new ThraedData(name,mtx);
        pthread_create(pts+i,nullptr,threadRun,td);
    }

    for(int i = 0;i<n;++i){
        int ret = pthread_join(pts[i],nullptr);
        if(ret!=0){
            perror("线程回收失败");
            return 1;
        }
    }
    pthread_mutex_destroy(&mtx);
    cout<<"所有线程回收完毕,剩余票数为："<<ticket<<endl;
    return 0;
}